#include "main.h"
#include "diccionario.h"

int
main(int argc, char * argv[])
{
	userArray * users;
	FILE * encFile, * respFile;
	dictioStruct * dictionary = NULL;

	if (argc != 3 && argc != 4 && argc != 5)
	{
		printf("Modo de uso: %s archivoDeUsuarios archivoAEspiar ", argv[0]);
		printf("[nombreDiccionario [nombreArchivoRespuesta]]\n");
		return 0;
	}

	if ( (users = getUsers(argv[1])) == NULL)
	{
		printf("Archivo de claves incorrecto\n");
		return 0;
	}

	if ( (encFile = fopen(argv[2],"rb")) == NULL)
	{
		printf("No se pudo abrir el archivo a espiar\n");
		return 0;
	}

	char * strDictioFile = argc >= 4 ? argv[3] : "diccionario.txt";
	char * strOutFile = argc == 5 ? argv[4] : "output.txt";

	if ( (respFile = fopen(strOutFile,"w")) == NULL)
	{
		printf("Error al tratar de abrir un archivo.\n");
		fclose(encFile);
		return 0;
	}

	if ( (dictionary = openDictionary(strDictioFile, MAXKEYLENGTH)) == NULL)
	{
		printf("Error al tratar de abrir el diccionario.\n");
		remove(strOutFile);
		return 0;
	}

	int i, textDecrypted = 0;

	//agrego los nombres de los usuarios al diccionario
	for (i = 0; i < users->size && textDecrypted == 0; i++)
	{
		if (addWord(dictionary, users->user[i].name) == -1)
		{
			printf("Error al tratar de abrir el diccionario.\n");
			freeDictionary(dictionary);
			remove(strOutFile);
			return 0;
		}
	}

	//pruebo desencriptar con todos los usuarios hasta que con alguno funcione
	for (i = 0; i < users->size && textDecrypted == 0; i++)
	{
		textDecrypted = decryptFile(users->user[i], encFile, respFile, dictionary);
	}

	fclose(respFile);
	fclose(encFile);
	freeUsers(users);
	freeDictionary(dictionary);

	if (textDecrypted == -1)
	{
		printf("Error grave.\n");
		remove(strOutFile);
		exit(EXIT_FAILURE);
	}

	if (textDecrypted)
	{
		printf(" el archivo fue desencriptado con exito.\n");
	}
	else
	{
		printf("No se pudo desencriptar el archivo.\n");
		remove(strOutFile);
	}

	return 0;
}

userArray *
getUsers(char * fileName)
{
	FILE * keysFile;
	userArray * users;
	int size = 10;

	if ( (keysFile = fopen(fileName,"r")) == NULL)
		return NULL;

	if ((users = malloc(sizeof(userArray))) == NULL)
	{
		fclose(keysFile);
		return NULL;
	}

	if ((users->user = malloc(sizeof(userElem) * size)) == NULL)
	{
		fclose(keysFile);
		free(users);
		return NULL;
	}

	int i = 0;
	while ( !feof(keysFile) )
	{
		if (i >= size) //veo si realoco mas espacio para usuarios
		{
			userElem * aux;
			size += 10;
			if ( (aux = realloc(users->user, sizeof(userElem) * size)) == NULL)
			{
				fclose(keysFile);
				freeUsers(users);
				return NULL;
			}
			users->user = aux;
		}

		int c, j = 0;
		while ( (c = getc(keysFile) ) != EOF && c != ':'
			&& j < MAXNAMELENGTH) //armo el nombre
		{
			users->user[i].name[j++] = c;
		}
		users->user[i].name[j] = '\0';

		if ( !feof(keysFile) )
		{
			//armo el vuelco hexadecimal
			if (fread(users->user[i].key, sizeof(unsigned char), HEXASTRLEN,
				 keysFile) != 0)
			{
				users->user[i].key[HEXASTRLEN] = '\0';
				i++;
			}
		}
		c = getc(keysFile); //saco el '\n'
	}

	users->size = i;

	fclose(keysFile);

	return users;

}

void freeUsers(userArray * users)
{
	free(users->user);
	free(users);
}
